package utility

import (
	"errors"
	"mldong/api/base"
	"reflect"
	"sync"

	"github.com/gogf/gf/v2/frame/g"
)

var (
	enums    []base.DictModelVO          = []base.DictModelVO{}
	enumMap  map[string]base.DictModelVO = make(map[string]base.DictModelVO)
	onceEnum sync.Once
)

// 注册枚举值集合
func RegisterEnumValues(dictName, dictKey string, values interface{}) {
	items := []base.DictItemModelVO{}

	val := reflect.ValueOf(values)
	if val.Kind() != reflect.Slice {
		return
	}

	for i := 0; i < val.Len(); i++ {
		elem := val.Index(i).Interface()
		key := reflect.ValueOf(elem).FieldByName("Key").String()
		code := reflect.ValueOf(elem).FieldByName("Code").Int()
		message := reflect.ValueOf(elem).FieldByName("Message").String()

		items = append(items, base.DictItemModelVO{
			DictItemKey:   key,
			DictItemValue: int(code),
			Name:          message,
		})
	}

	RegisterEnum(base.DictModelVO{
		Name:    dictName,
		DictKey: dictKey,
		Items:   items,
	})
}

// RegisterEnum 注册枚举（线程安全）
func RegisterEnum(vo base.DictModelVO) {
	onceEnum.Do(func() {
		enums = make([]base.DictModelVO, 0)
		enumMap = make(map[string]base.DictModelVO) // 初始化map
	})
	enums = append(enums, vo)
	enumMap[vo.DictKey] = vo
}

// GetEnums 获取所有已注册的枚举
func GetEnums() []base.DictModelVO {
	return enums
}

// 获取自定义字典
func GetCustomDict() []base.DictModelVO {
	return []base.DictModelVO{}
}

// 将字典模型转为LabelValueVO
func DictModelToLabelValue(vo base.DictModelVO) []base.LabelValueVO {
	labelValues := make([]base.LabelValueVO, 0, len(vo.Items))

	for _, item := range vo.Items {
		labelValues = append(labelValues, base.LabelValueVO{
			Value: item.DictItemValue, // 使用枚举值作为value
			Label: item.Name,          // 使用显示名称作为label
			Ext:   g.Map{},
		})
	}
	return labelValues
}

// 从枚举字典中查找字典模型
func FindInEnumMapModel(dictKey string) (base.DictModelVO, error) {
	for _, dictModel := range enumMap {
		if dictModel.DictKey == dictKey {
			return dictModel, nil
		}
	}
	return base.DictModelVO{}, errors.New("字典模型不存在")
}
